//////////////////////////////////////////////////////////////////////
//
// NO_Plugin.cpp interface for the NO_Plugin class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_Plugin.h"

//////////////////////////////////////////////////////////////////////////
NO_Plugin::Plugins NO_Plugin::plugins;

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_Plugin* NO_Plugin::define(const NO_Int8* name)
{
	NO_UInt32 id = noGetHash(name);
	if(plugins.find(id)!=plugins.end())
	{
		std::cout<<"Plug-in already registered"<<std::endl; 
		return 0;
	}	

	return new NO_Plugin(name,id);
}

//////////////////////////////////////////////////////////////////////
NO_Plugin::NO_Plugin(const NO_Int8* name, NO_UInt32 id):id(id),name(name){plugins.insert(this);}

//////////////////////////////////////////////////////////////////////
NO_Plugin::~NO_Plugin()
{
	plugins.erase(id);
	
	NO_TypeList::ListIter iter = types.list.begin();
	NO_TypeList::ListIter end = types.list.end();
	while (iter!=end)
	{
		delete (*iter);
		iter++;
	}
}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
void NO_Plugin::addType(const NO_Type& type){types<<type;}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
	  NO_UInt32		NO_Plugin::getID		(void) const {return id;}
const std::string&	NO_Plugin::getName		(void) const {return name;}
const NO_TypeList&	NO_Plugin::getTypes		(void) const {return types;}

//////////////////////////////////////////////////////////////////////////
NO_Plugin::iterator NO_Plugin::getBegin(void)			{return plugins.begin();}
NO_Plugin::iterator NO_Plugin::getEnd(void)				{return plugins.end();}
NO_Plugin::iterator NO_Plugin::getNext(iterator iter)	{return ++iter;}

//////////////////////////////////////////////////////////////////////
// private
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_Plugin& NO_Plugin::operator=(const NO_Plugin& rhs){return (*this);}
NO_Plugin::NO_Plugin(const NO_Plugin& rhs){}


